package santeclair.referentiel.optique.offreclair.dao.impl;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Repository;

import santeclair.lunar.framework.dao.jpa.impl.FwkGenericJpaDAO;
import santeclair.referentiel.optique.config.Constant;
import santeclair.referentiel.optique.model.Verre;
import santeclair.referentiel.optique.offreclair.dao.VerreOffreclairDao;
import santeclair.referentiel.optique.referentiel.enumeration.GeometrieVerreEnum;

@Repository("verreOffreclairDao")
public class VerreOffreclairDaoImpl extends FwkGenericJpaDAO<Verre> implements VerreOffreclairDao {

    @PersistenceContext(unitName = Constant.PERSISTENCE_UNIT_NAME)
    private EntityManager entityManager;

    @Override
    public List<Verre> findVerreOffreclair(String codeFabricant, GeometrieVerreEnum geometrieVerreEnum, String codeMatiere, BigDecimal indice) {

        StringBuffer sbf = new StringBuffer();
        sbf.append("SELECT verre FROM " + Verre.class.getName() + " verre ");
        sbf.append(" JOIN FETCH verre.fabricantOptique fabricantOptique ");
        sbf.append(" JOIN FETCH verre.geometrieVerre geometrieVerre ");
        sbf.append(" JOIN FETCH verre.materiauxVerre materiauxVerre ");

        sbf.append(" WHERE geometrieVerre.codeGeometrieVerre = :geometrieVerre ");
        sbf.append(" AND fabricantOptique.codeFabricantOptique = :codeFabricant ");
        sbf.append(" AND materiauxVerre.codeMateriauxVerre = :codeMatiereVerre ");
        sbf.append(" AND verre.indiceVerre = :indice ");
        sbf.append(" AND verre.offreclair = :offreclair ");

        TypedQuery<Verre> query = entityManager.createQuery(sbf.toString(), Verre.class);

        query.setParameter("geometrieVerre", geometrieVerreEnum);
        query.setParameter("codeFabricant", codeFabricant);
        query.setParameter("codeMatiereVerre", codeMatiere);
        query.setParameter("indice", indice);
        query.setParameter("offreclair", true);

        return query.getResultList();

    }

    @Override
    public Class<Verre> getEntityClass() {
        return Verre.class;
    }

    @Override
    public EntityManager getEntityManager() {
        return entityManager;
    }
}
